// 活商品BUFF
// BUFF，存在在商品中，可由店铺、联盟、活动中继承而来，效力于用户
//其中，店铺的BUFF需要由自身的BUFF+店铺BUFF+活动的BUFF+联盟的BUFF
//其它活动的BUFF=自身BUFF+联盟BUFF
(function() {

	//构造函数
	var _con = function(args) {
		var self = this;
		//ID编号
		self._id = db_id_prefix + Math.random().toString(16).substr(2) + (+new Date).toString(16);
		//Buff名称
		buff_name = args.name;
		if (!helper.folder_name(buff_name)) {
			throwCusError("BUFF命名不规范")
		}
		//名字可重复
		self.buff_name = buff_name;
		//BUFF描述
		self.intro = args.intro ? String(args.intro) : "";
		// // 是否唯一，如果唯一，则存储唯一标识
		//否可与其它同性质BUFF是叠加
		self.alone = args.alone ? (self._id + self.alone) : false;
		//是否隐藏
		self.hidden = !!args.hidden;
		// //事件类型，beforePay、afterPay
		// self.eventName = String(args.eventName).toLowerCase();//使用env参数进行替代
		//指向代码片段
		self.code_id = args.code_id;
		//BUFF配置
		self.config = args.config;
		//额外信息，形式不唯一
		self.info = args.info || {};
		//生效时间
		self.begin_time = args.begin_time;
		//失效时间
		self.end_time = args.end_time;

		db.insert(db_table_name, self);
		console.log("创建了一个Buff：", buff_name, self._id);
	};
	//PS:模块的暴露放在require skill前面，因为二者互相依赖
	module.exports = _con;
	//技能
	_con.prototype = require("./skill");

	//静态方法
	_con.get = function(Id) {
		var result = db.find_by_id(db_table_name, Id);
		if (result) {
			result.__proto__ = _con.prototype;
		}
		return result;
	};
	//直接还原出一个实例
	_con.getInstance = function(buff) {
		buff.__proto__ = _con.prototype;
		return buff;
	}

	//环境变量，BuffCode需要根据对这些环境变量做相应的算法调整
	_con.env = {
		//前端获取到这种BUFF信息，可能是一些特效的播放（后台无触发条件）
		beforeShow: "前端页面载入时",
		//单纯的计算价格等等（获取商品价格时触发）
		showing: "未购买",
		//结合购物车中的商品混合计算价格等等（加入购物车时触发）
		addInCart: "加入到购物车中",
		//在订单中的算法（在线支付时触发），比如在线支付的优惠
		inOnlinePayAch: "在线支付",
		//线下货到付款支付时触发，比如货到付款的优惠
		inCashPay: "货到付款",
		//支付完成后的BUFF（交易完成后触发）
		afterPayAch: "完成支付"
	}
	var db = require("../db/index");
	var config = require("../_include/config");
	var db_table_name = config.dbname.buff;
	var db_id_prefix = config.dbIdPrefix.buff;
	var BusCon = require("../bus/_con");
	var helper = require("../_include/helper");
}());